/*

    array.h - header of the array class
    Author Julio Agustin Barrera Mendoza
    Copyright (C) 2009 CINVESTAV-IPN.

    This program is free software; you can redistribute it and/or modify it 
    under the terms of the GNU General Public License as published by 
    the Free Software Foundation; either version 2 of the License, 
    or (at your option) any later version.

    This program is distributed in the hope that it will be useful, 
    but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along with this program; 
    if not, write to the Free Software Foundation, Inc., 59 Temple Place, 
    Suite 330, Boston, MA 02111-1307 USA

 */

#ifndef ARRAY_H
#define ARRAY_H

#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

// ------------------------------------------------------------------
// CLASS Array
// ------------------------------------------------------------------

class Array
{
  public:
    Array();
    Array(unsigned int inSize, long double inValue = 0.0);
    ~Array();
    
    long double &operator[](unsigned int index) {return array.at(index);}
    const long double &operator[](unsigned int index) const {return array.at(index);}
    
    void resize(unsigned int inSize) {array.resize(inSize);}
    
    unsigned int size(void) const {return array.size();}
    
    void push_back(long double inValue) {array.push_back(inValue);}
    void pop_back(void) {array.pop_back();}

    long double Norm(void);

    Array &operator+=(const Array &rh);
    Array &operator-=(const Array &rh);

    friend const Array operator+(const Array &lh, const Array &rh);
    friend const Array operator-(const Array &lh, const Array &rh);
    friend const Array operator*(const long double &lh, const Array &rh);
    friend const Array operator*(const Array &lh, const long double &rh);
    friend Array &operator<<(Array &lh, const long double rh) {lh.push_back(rh); return lh;}
    friend ostream &operator<<(ostream &output, const Array &rh);
    
    friend const Array CartesianProduct(const Array &lh, const Array &rh);
    friend long double DotProduct(const Array &lh, const Array &rh);
    friend long double Distance(const Array &lh, const Array &rh);

  private:
    vector<long double> array;
};

#endif
